Описание проекта
Инвесторы решили открыть заведение общественного питания в Москве. Таким заведением может стать кофейня.
Необходимо подготовить исследование рынка Москвы, найти интересные особенности и презентовать полученные результаты, которые в будущем помогут в выборе подходящего инвесторам места. Также необходимо дать рекомендации для открытия кофейни (расположение, количество посадосных мест и т.д.)
Доступен датасет с заведениями общественного питания Москвы, составленный на основе данных сервисов Яндекс Карты и Яндекс Бизнес на лето 2022 года. Информация, размещённая в сервисе Яндекс Бизнес, могла быть добавлена пользователями или найдена в общедоступных источниках. Она носит исключительно справочный характер.
Описание данных
Файл moscow_places.csv:
Презентация с результатами исследования
Подключим библиотеки
import pandas as pd
import plotly.express as px
import json
from folium import Map, Marker, Choropleth
from folium.plugins import MarkerCluster
Путь к файлу: /datasets/moscow_places.csv.
try:
places = pd.read_csv('/datasets/moscow_places.csv')
except FileNotFoundError:
print("File not found.")
places
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | WoWфли | кафе | Москва, улица Дыбенко, 7/1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.878494 | 37.478860 | 5.0 | NaN | NaN | NaN | NaN | 0 | NaN |
| 1 | Четыре комнаты | ресторан | Москва, улица Дыбенко, 36, корп. 1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.875801 | 37.484479 | 4.5 | выше среднего | Средний счёт:1500–1600 ₽ | 1550.0 | NaN | 0 | 4.0 |
| 2 | Хазри | кафе | Москва, Клязьминская улица, 15 | Северный административный округ | пн-чт 11:00–02:00; пт,сб 11:00–05:00; вс 11:00... | 55.889146 | 37.525901 | 4.6 | средние | Средний счёт:от 1000 ₽ | 1000.0 | NaN | 0 | 45.0 |
| 3 | Dormouse Coffee Shop | кофейня | Москва, улица Маршала Федоренко, 12 | Северный административный округ | ежедневно, 09:00–22:00 | 55.881608 | 37.488860 | 5.0 | NaN | Цена чашки капучино:155–185 ₽ | NaN | 170.0 | 0 | NaN |
| 4 | Иль Марко | пиццерия | Москва, Правобережная улица, 1Б | Северный административный округ | ежедневно, 10:00–22:00 | 55.881166 | 37.449357 | 5.0 | средние | Средний счёт:400–600 ₽ | 500.0 | NaN | 1 | 148.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 8401 | Суши Мания | кафе | Москва, Профсоюзная улица, 56 | Юго-Западный административный округ | ежедневно, 09:00–02:00 | 55.670021 | 37.552480 | 4.4 | NaN | NaN | NaN | NaN | 0 | 86.0 |
| 8402 | Миславнес | кафе | Москва, Пролетарский проспект, 19, корп. 1 | Южный административный округ | ежедневно, 08:00–22:00 | 55.640875 | 37.656553 | 4.8 | NaN | NaN | NaN | NaN | 0 | 150.0 |
| 8403 | Самовар | кафе | Москва, Люблинская улица, 112А, стр. 1 | Юго-Восточный административный округ | ежедневно, круглосуточно | 55.648859 | 37.743219 | 3.9 | NaN | Средний счёт:от 150 ₽ | 150.0 | NaN | 0 | 150.0 |
| 8404 | Чайхана Sabr | кафе | Москва, Люблинская улица, 112А, стр. 1 | Юго-Восточный административный округ | ежедневно, круглосуточно | 55.648849 | 37.743222 | 4.2 | NaN | NaN | NaN | NaN | 1 | 150.0 |
| 8405 | Kebab Time | кафе | Москва, Россошанский проезд, 6 | Южный административный округ | ежедневно, круглосуточно | 55.598229 | 37.604702 | 3.9 | NaN | NaN | NaN | NaN | 0 | 12.0 |
8406 rows × 14 columns
places.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 8406 entries, 0 to 8405 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 8406 non-null object 1 category 8406 non-null object 2 address 8406 non-null object 3 district 8406 non-null object 4 hours 7870 non-null object 5 lat 8406 non-null float64 6 lng 8406 non-null float64 7 rating 8406 non-null float64 8 price 3315 non-null object 9 avg_bill 3816 non-null object 10 middle_avg_bill 3149 non-null float64 11 middle_coffee_cup 535 non-null float64 12 chain 8406 non-null int64 13 seats 4795 non-null float64 dtypes: float64(6), int64(1), object(7) memory usage: 919.5+ KB
Данные загружены. Установлено, что:
Изучим, есть ли дубликаты и пропуски в данных.
Приведем к нижнему регистру значения в колонках содержащих категориальные данные name и address.
for column in places[['name', 'address']]:
places[column] = places[column].str.lower()
places.duplicated().sum()
0
Полные дубликаты отсутствуют. Проверим наличие дубликатов по столбцам name и address:
places.duplicated(subset=['name', 'address']).sum()
4
Выявлено 4 строки неполных дубликатов. Посмотрим что это за дубликаты.
places[places.duplicated(subset=['name', 'address'])]
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 215 | кафе | кафе | москва, парк ангарские пруды | Северный административный округ | ежедневно, 10:00–22:00 | 55.881438 | 37.531848 | 3.2 | NaN | NaN | NaN | NaN | 0 | NaN |
| 1511 | more poke | ресторан | москва, волоколамское шоссе, 11, стр. 2 | Северный административный округ | пн-чт 09:00–18:00; пт,сб 09:00–21:00; вс 09:00... | 55.806307 | 37.497566 | 4.2 | NaN | NaN | NaN | NaN | 1 | 188.0 |
| 2420 | раковарня клешни и хвосты | бар,паб | москва, проспект мира, 118 | Северо-Восточный административный округ | пн-чт 12:00–00:00; пт,сб 12:00–01:00; вс 12:00... | 55.810677 | 37.638379 | 4.4 | NaN | NaN | NaN | NaN | 1 | 150.0 |
| 3109 | хлеб да выпечка | кафе | москва, ярцевская улица, 19 | Западный административный округ | NaN | 55.738449 | 37.410937 | 4.1 | NaN | NaN | NaN | NaN | 0 | 276.0 |
Выведем все пары дублирующихся строк.
name_duplicated = places[places.duplicated(subset=['name', 'address'])]['name']
name_duplicated
215 кафе 1511 more poke 2420 раковарня клешни и хвосты 3109 хлеб да выпечка Name: name, dtype: object
address_duplicated = places[places.duplicated(subset=['name', 'address'])]['address']
address_duplicated
215 москва, парк ангарские пруды 1511 москва, волоколамское шоссе, 11, стр. 2 2420 москва, проспект мира, 118 3109 москва, ярцевская улица, 19 Name: address, dtype: object
places.query('name in @name_duplicated & address in @address_duplicated')
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 189 | кафе | кафе | москва, парк ангарские пруды | Северный административный округ | ежедневно, 09:00–23:00 | 55.880327 | 37.530786 | 3.2 | NaN | NaN | NaN | NaN | 0 | NaN |
| 215 | кафе | кафе | москва, парк ангарские пруды | Северный административный округ | ежедневно, 10:00–22:00 | 55.881438 | 37.531848 | 3.2 | NaN | NaN | NaN | NaN | 0 | NaN |
| 1430 | more poke | ресторан | москва, волоколамское шоссе, 11, стр. 2 | Северный административный округ | ежедневно, 09:00–21:00 | 55.806307 | 37.497566 | 4.2 | NaN | NaN | NaN | NaN | 0 | 188.0 |
| 1511 | more poke | ресторан | москва, волоколамское шоссе, 11, стр. 2 | Северный административный округ | пн-чт 09:00–18:00; пт,сб 09:00–21:00; вс 09:00... | 55.806307 | 37.497566 | 4.2 | NaN | NaN | NaN | NaN | 1 | 188.0 |
| 2211 | раковарня клешни и хвосты | ресторан | москва, проспект мира, 118 | Северо-Восточный административный округ | ежедневно, 12:00–00:00 | 55.810553 | 37.638161 | 4.4 | NaN | NaN | NaN | NaN | 0 | 150.0 |
| 2420 | раковарня клешни и хвосты | бар,паб | москва, проспект мира, 118 | Северо-Восточный административный округ | пн-чт 12:00–00:00; пт,сб 12:00–01:00; вс 12:00... | 55.810677 | 37.638379 | 4.4 | NaN | NaN | NaN | NaN | 1 | 150.0 |
| 3091 | хлеб да выпечка | булочная | москва, ярцевская улица, 19 | Западный административный округ | ежедневно, 09:00–22:00 | 55.738886 | 37.411648 | 4.1 | NaN | NaN | NaN | NaN | 1 | 276.0 |
| 3109 | хлеб да выпечка | кафе | москва, ярцевская улица, 19 | Западный административный округ | NaN | 55.738449 | 37.410937 | 4.1 | NaN | NaN | NaN | NaN | 0 | 276.0 |
Согласно данным Яндекс карт в настоящее время актуальными являютcя записи:
Удалим неактуальные записи.
places = places.drop(index=[215, 1430, 2211, 3109])
places.duplicated(subset=['name', 'address']).sum()
0
Больше дубликатов не осталось.
places.isna().sum()
name 0 category 0 address 0 district 0 hours 535 lat 0 lng 0 rating 0 price 5087 avg_bill 4586 middle_avg_bill 5253 middle_coffee_cup 7867 chain 0 seats 3610 dtype: int64
# функция для визуализации доли пропущенных значений
def pass_value_barh(df):
"""Визуализация процента пропущенных значений"""
try:
pass_value = (
(df.isna().mean()*100)
.to_frame()
.rename(columns={0:'space'})
.query('space > 0')
.sort_values(by='space', ascending=True)
)
pass_value = pass_value.round(2)
fig = px.bar(pass_value, x='space', y=pass_value.index, text='space')
fig.update_layout(
title='Процент пропущенных значений в столбцах',
title_x=0.5,
xaxis_title='Процент пропущенных значений',
yaxis_title='Столбец',
xaxis=dict(range=[0, 100]))
fig.show()
except:
print('пропусков не осталось :) или произошла ошибка в первой части функции ')
pass_value_barh(places)
Достаточно большое количество пропусков в столбцах middle_coffee_cup, middle_avg_bill, price, avg_bill и seats (больше 40% значений отсутствует). менее 10% значений пропущено в столбце hours.
Заменим пропуски в столбцах с категориальными переменными (price, avg_bill и hours) на значение "нет данных". В столбцах с количественными переменными (middle_coffee_cup, middle_avg_bill и seats) замены проводить не будем.
places[['price', 'avg_bill', 'hours']] = places[
['price', 'avg_bill', 'hours']].fillna('нет данных')
pass_value_barh(places)
places['street'] = places['address'].str.split(', ', expand=True)[1]
places[['address', 'street']]
| address | street | |
|---|---|---|
| 0 | москва, улица дыбенко, 7/1 | улица дыбенко |
| 1 | москва, улица дыбенко, 36, корп. 1 | улица дыбенко |
| 2 | москва, клязьминская улица, 15 | клязьминская улица |
| 3 | москва, улица маршала федоренко, 12 | улица маршала федоренко |
| 4 | москва, правобережная улица, 1б | правобережная улица |
| ... | ... | ... |
| 8401 | москва, профсоюзная улица, 56 | профсоюзная улица |
| 8402 | москва, пролетарский проспект, 19, корп. 1 | пролетарский проспект |
| 8403 | москва, люблинская улица, 112а, стр. 1 | люблинская улица |
| 8404 | москва, люблинская улица, 112а, стр. 1 | люблинская улица |
| 8405 | москва, россошанский проезд, 6 | россошанский проезд |
8402 rows × 2 columns
def categorize_hours(hours):
try:
if hours == 'ежедневно, круглосуточно':
return True
else:
return False
except:
pass
places['is_24_7'] = places['hours'].apply(categorize_hours)
places[['hours', 'is_24_7']]
| hours | is_24_7 | |
|---|---|---|
| 0 | ежедневно, 10:00–22:00 | False |
| 1 | ежедневно, 10:00–22:00 | False |
| 2 | пн-чт 11:00–02:00; пт,сб 11:00–05:00; вс 11:00... | False |
| 3 | ежедневно, 09:00–22:00 | False |
| 4 | ежедневно, 10:00–22:00 | False |
| ... | ... | ... |
| 8401 | ежедневно, 09:00–02:00 | False |
| 8402 | ежедневно, 08:00–22:00 | False |
| 8403 | ежедневно, круглосуточно | True |
| 8404 | ежедневно, круглосуточно | True |
| 8405 | ежедневно, круглосуточно | True |
8402 rows × 2 columns
Проведена предобработка данных:
category_places = places.pivot_table(index='category', values='name', aggfunc='count')
category_places['part'] = round(
(100 * category_places['name'] / category_places['name'].sum()), 2)
category_places.sort_values(by='part', ascending = False)
| name | part | |
|---|---|---|
| category | ||
| кафе | 2376 | 28.28 |
| ресторан | 2041 | 24.29 |
| кофейня | 1413 | 16.82 |
| бар,паб | 765 | 9.10 |
| пиццерия | 633 | 7.53 |
| быстрое питание | 603 | 7.18 |
| столовая | 315 | 3.75 |
| булочная | 256 | 3.05 |
В данных представлена информация о следующих категориях (в порядке убывания количества заведений): кафе; ресторан; кофейня; бар,паб; пиццерия; быстрое питание; столовая; булочная
Исследуем количество объектов общественного питания по категориям: рестораны, кофейни, пиццерии, бары и так далее. Построим визуализации.
df = places.groupby(
'category', as_index=False
).agg({'name': 'count'}
).sort_values(by='name', ascending=True)
fig = px.bar(
df,
x='name',
y='category',
text='name'
)
fig.update_layout(
title='Количество объектов общественного питания по категориям',
title_x = 0.5,
xaxis_title='Количество объектов',
yaxis_title='Категория'
)
fig.show()
Самое большое количество заведений в данных - кафе. Затем идут рестораны и кофейни. Самое маленькое количество заведений типа булочная и столовая.
sort_list = places.groupby(
'category'
).agg({'seats' : 'median'}).sort_values(by='seats').index
fig = px.box(
places,
x='seats',
y='category',
orientation='h',
category_orders={'category': sort_list}
)
fig.update_layout(
title='Количество посадочных мест по категориям',
title_x = 0.5,
xaxis_title='Количество посадочных мест',
yaxis_title='Категория'
)
fig.show()
Иногда количество посадочных мест в заведениях общепита может достигать 1288. Не очень понятно как можно обслужить такое количество посетителей при полной посадке. Вероятнее всего в данных ошибка.
Нормальный диапазон значений количества посадочных мест не превышает 350. Рассмотрим этот диапазон.
fig = px.box(
places,
x='seats',
y='category',
orientation='h',
range_x=[0,350],
category_orders={'category': sort_list}
)
fig.update_layout(
title='Количество посадочных мест по категориям (диапазон от 0 до 350 мест)',
title_x = 0.5,
xaxis_title='Количество посадочных мест',
yaxis_title='Категория'
)
fig.show()
Самое маленькое количество посадочных мест обычно в булочных, пицериях и кафе. Медианное значение этих заведений 50-60 мест. Самое большое количество посадочных мест в ресторанах, барах и кофейнях. Медианное значение около 80-86 мест.
df = places.groupby('chain', as_index=False).agg({'name': 'count'})
chain_dict = {
0 : 'несетевые',
1 : 'сетевые'
}
df['chain'] = df['chain'].map(chain_dict)
fig = px.pie(
df,
names='chain',
values='name',
hole = 0.4,
color = 'chain',
color_discrete_map = {
'несетевые': '#8690FF',
'сетевые': '#ACD0F4',
}
)
fig.update_layout(
title='Cоотношение сетевых и несетевых заведений',
title_x = 0.5,
showlegend=False,
)
fig.update_traces(
textposition='outside',
textinfo='percent+label',
marker=dict(line=dict(color='#000000',width=2)),
)
fig.show()
Сетевых заведений общественного питания в Москве меньше, чем несетевых. Доля сетевых - 38.1%, несетевых - 61.9%.
df = places.groupby('category', as_index=False).agg({'chain': 'mean'}).sort_values(by='chain')
df.columns = ['category', 'part_of_chain']
df['part_of_chain'] = round((100 * df['part_of_chain']), 2)
df
| category | part_of_chain | |
|---|---|---|
| 0 | бар,паб | 22.09 |
| 7 | столовая | 27.94 |
| 3 | кафе | 32.79 |
| 6 | ресторан | 35.77 |
| 2 | быстрое питание | 38.47 |
| 4 | кофейня | 50.96 |
| 5 | пиццерия | 52.13 |
| 1 | булочная | 61.33 |
df = places.groupby('category', as_index=False).agg({'chain': 'mean'}).sort_values(by='chain', ascending=False)
df.columns = ['category', 'part_of_chain']
df['part_of_chain'] = round((100 * df['part_of_chain']), 2)
fig = px.bar(
df,
x='category',
y='part_of_chain',
text='part_of_chain'
)
fig.update_layout(
title='Доля сетевых заведений в каждой категории',
title_x = 0.5,
xaxis_title='Категория',
yaxis_title='Доля сетевых заведений'
)
fig.show()
Чаще всего сетевыми заведениями являются булочные, пиццерии и кофейни.
Реже всего - столовые и бары.
df = places.query(
'chain == 1'
).groupby(
'name', as_index=False
).agg(
{'category': 'count'}
).sort_values(
by='category', ascending=True
).tail(15)
top_15_chain = df['name']
fig = px.bar(
df,
x='category',
y='name',
text='category'
)
fig.update_layout(
title='Топ-15 популярных сетей в Москве',
title_x = 0.5,
xaxis_title='Количество объектов',
yaxis_title='Название сети'
)
fig.show()
Самое большое количество точек в Москве у сети "Шоколадница" - 120 точек. Затем идут сети пиццерий "Домино'с пицца" и "Додо пицца".
Посмотрим к какой категории заведений относятся эти сети.
places.query(
'name in @top_15_chain'
).groupby(
'name'
).agg(
{'category': 'first'}
).sort_values(
by='category'
)
| category | |
|---|---|
| name | |
| буханка | булочная |
| хинкальная | быстрое питание |
| кулинарная лавка братьев караваевых | кафе |
| му-му | кафе |
| чайхана | кафе |
| cofefest | кофейня |
| cofix | кофейня |
| one price coffee | кофейня |
| кофепорт | кофейня |
| шоколадница | кофейня |
| додо пицца | пиццерия |
| домино'с пицца | пиццерия |
| prime | ресторан |
| теремок | ресторан |
| яндекс лавка | ресторан |
Популярные сети относятся к разным категориям. 5 из 15 - кофейни ("Cofefest", "Cofix", "One price coffee", "Кофепорт" и "Шоколадница"), 3 ресторана ("Prime", "Теремок" и "Яндекс лавка") и 3 кафе ("Кулинарная лавка братьев Караваевых", "Му-му" и "Чайхана"), 2 пиццеррии ("Домино'с пицца" и "Додо пицца"), а также булочная ("Буханка") и заведение быстрого питания ("Хинкальная")
dict_distr={
'Северный административный округ' : 'САО',
'Северо-Восточный административный округ' : 'СВАО',
'Северо-Западный административный округ' : 'СЗАО',
'Западный административный округ' : 'ЗАО',
'Центральный административный округ' : 'ЦАО',
'Восточный административный округ' : 'ВАО',
'Юго-Восточный административный округ' : 'ЮВАО',
'Южный административный округ' : 'ЮАО',
'Юго-Западный административный округ' : 'ЮЗАО'
}
data_chain = places.query('name in @top_15_chain').groupby(
['district','category'], as_index=False
).agg({'name': 'count'}).sort_values(by='name', ascending=False)
data_chain['district'] = data_chain['district'].map(dict_distr)
fig = px.bar(
data_chain,
x='district',
y='name',
color='category',
height=900,
text='name',
color_discrete_map = {
'кафе': '#30BFDD',
'ресторан': '#8690FF',
'кофейня': '#ACD0F4',
'бар,паб': '#F7C0BB',
'пиццерия': '#BA55D3',
'быстрое питание': '#DDA0DD',
'столовая': '#B0C4DE',
'булочная': '#00BFFF'
}
)
fig.update_layout(
legend=dict(
yanchor="top",
y=0.99,
xanchor="right",
x=0.99
),
legend_title_text='Категория',
title='Количество сетевых заведений каждой категории по районам Москвы',
title_x = 0.5,
xaxis_title='Районы Москвы',
yaxis_title='Количество объектов',
xaxis = {"categoryorder":"total descending"}
)
fig.update_traces(textangle=0)
fig.show()
Больше всего сетевых заведений (из ТОП-15) расположено в Центральном административном округе (более 200 заведений). Примерно одинаковое количество (около 80) в Западном, Северном, Северо-Восточном, Южном и Восточном административных округах. Самое маленькое количество в Северо-Западном административном округе.
data_distr = places.groupby(
['district','category'], as_index=False
).agg({'name': 'count'}
).sort_values(by='name', ascending=False)
data_distr['district'] = data_distr['district'].map(dict_distr)
fig = px.bar(
data_distr,
x='district',
y='name',
color='category',
height=900,
text='name',
color_discrete_map = {
'кафе': '#30BFDD',
'ресторан': '#8690FF',
'кофейня': '#ACD0F4',
'бар,паб': '#F7C0BB',
'пиццерия': '#BA55D3',
'быстрое питание': '#DDA0DD',
'столовая': '#B0C4DE',
'булочная': '#00BFFF'
}
)
fig.update_layout(
legend=dict(
yanchor="top",
y=0.99,
xanchor="right",
x=0.99
),
legend_title_text='Категория',
title='Количество заведений каждой категории по районам Москвы',
title_x = 0.5,
xaxis_title='Районы Москвы',
yaxis_title='Количество объектов',
xaxis = {"categoryorder":"total descending"}
)
fig.show()
Больше всего заведений в Центральном административном районе. Более чем в 2 раза больше, чем в остальных районах.
Меньше всего заведений в Северо-Западном административном округе.
В Центральном административном районе самая популярная категория заведений - ресторан. Затем идут кафе и кофейни.
В остальных районах самая популярная категория заведений - кафе. После кафе идут рестораны и кофейни.
Меньше всего во всех районах булочных и столовых.
df = places.groupby(
'category', as_index=False
).agg(
{'rating': 'mean'}
).sort_values(by='rating', ascending=True)
df['rating'] = df['rating'].round(2)
fig = px.bar(
df,
y='category',
x='rating',
text='rating',
range_x=[4,4.45]
)
fig.update_layout(
title='Распределение средних рейтингов по категориям заведений',
title_x = 0.5,
xaxis_title='Средний рейтинг',
yaxis_title='Категория заведения'
)
fig.show()
Самый высокий средний рейтинг у баров (4.39). Затем идут пиццерии, рестораны, кофейни и булочные (средний рейтинг 4.3 - 4.27). Ниже средний рейтинг столовых (4.21) и кафе (4.12). Самый низкий рейтинг у предприятий быстрого питания - 4.05
distr_rating = places.groupby('district', as_index=False).agg({'rating': 'mean'})
distr_rating['rating'] = distr_rating['rating'].round(2)
# загружаем JSON-файл с границами округов Москвы
state_geo = '/datasets/admin_level_geomap.geojson'
# moscow_lat - широта центра Москвы, moscow_lng - долгота центра Москвы
moscow_lat, moscow_lng = 55.751244, 37.618423
# создаём карту Москвы
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10, tiles='Cartodb Positron')
# создаём хороплет с помощью конструктора Choropleth и добавляем его на карту
Choropleth(
geo_data=state_geo,
data=distr_rating,
columns=['district', 'rating'],
key_on='feature.name',
fill_opacity=0.8,
legend_name='Средний рейтинг заведений по районам',
).add_to(m)
# выводим карту
m
distr_rating
| district | rating | |
|---|---|---|
| 0 | Восточный административный округ | 4.17 |
| 1 | Западный административный округ | 4.18 |
| 2 | Северный административный округ | 4.24 |
| 3 | Северо-Восточный административный округ | 4.15 |
| 4 | Северо-Западный административный округ | 4.21 |
| 5 | Центральный административный округ | 4.38 |
| 6 | Юго-Восточный административный округ | 4.10 |
| 7 | Юго-Западный административный округ | 4.17 |
| 8 | Южный административный округ | 4.18 |
Самый высокий средний рейтинг в заведениях Центрального и Северного административных округов. Самый низкий средний рейтинг заведений Юго-Восточного административного округа
# создаём карту Москвы
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10, tiles="Cartodb Positron")
# создаём пустой кластер, добавляем его на карту
marker_cluster = MarkerCluster().add_to(m)
# пишем функцию, которая принимает строку датафрейма,
# создаёт маркер в текущей точке и добавляет его в кластер marker_cluster
def create_clusters(row):
Marker(
[row['lat'], row['lng']],
popup=f"{row['name']} ★ {row['rating']} ({row['category']})",
).add_to(marker_cluster)
# применяем функцию create_clusters() к каждой строке датафрейма
places.apply(create_clusters, axis=1)
# выводим карту
m
Самое большое количество заведений расположено в центре Москвы.
top15_streets = places.groupby(
'street', as_index=False
).agg(
{'name': 'count'}
).sort_values(
by='name', ascending=True
).tail(15)['street']
data_streets = places.query(
'street in @ top15_streets'
).groupby(
['street','category'], as_index=False
).agg({'name': 'count'}).sort_values(
by='name', ascending=False)
fig = px.bar(
data_streets,
x='street',
y='name',
color='category',
height=900,
text='name',
color_discrete_map = {
'кафе': '#30BFDD',
'ресторан': '#8690FF',
'кофейня': '#ACD0F4',
'бар,паб': '#F7C0BB',
'пиццерия': '#BA55D3',
'быстрое питание': '#DDA0DD',
'столовая': '#B0C4DE',
'булочная': '#00BFFF'
}
)
fig.update_layout(
legend=dict(
yanchor="top",
y=0.99,
xanchor="right",
x=0.99
),
legend_title_text='Категория',
title='Количество заведений каждой категории по улицам Москвы',
title_x = 0.5,
xaxis_title='Улицы Москвы',
yaxis_title='Количество объектов',
xaxis = {"categoryorder":"total descending"}
)
fig.update_traces(textangle=0)
fig.show()
Самое большое количество заведений на проспекте Мира. Самые многочисленные категории: кафе, рестораны и кофейни. В ТОП-15 улиц по количеству заведений ожидаемо попали самые длинные улицы Москвы.
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10, tiles='Cartodb Positron')
# пишем функцию, которая принимает строку датафрейма,
# создаёт маркер в текущей точке и добавляет его на карту
def create_marker(row):
Marker([row['lat'], row['lng']],
popup=f"{row['name']} {row['rating']}"
).add_to(m)
# применяем функцию для создания маркера ко всем строкам датафрейма
places.query('street in @ top15_streets').apply(create_marker, axis=1)
# выводим карту
m
only_one = places.groupby('street', as_index=False).agg({'name': 'count'})
only_one_place = only_one.query('name == 1')['street']
only_one_place_street = places.query('street in @only_one_place')
only_one_place_street
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | street | is_24_7 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 15 | дом обеда | столовая | москва, улица бусиновская горка, 2 | Северный административный округ | пн-пт 08:30–18:30; сб 10:00–20:00 | 55.885890 | 37.493264 | 4.1 | средние | Средний счёт:300–500 ₽ | 400.0 | NaN | 0 | 180.0 | улица бусиновская горка | False |
| 21 | 7/12 | кафе | москва, прибрежный проезд, 7 | Северный административный округ | ежедневно, 10:00–22:00 | 55.876805 | 37.464934 | 4.5 | нет данных | нет данных | NaN | NaN | 0 | NaN | прибрежный проезд | False |
| 25 | в парке вкуснее | кофейня | москва, парк левобережный | Северный административный округ | ежедневно, 10:00–21:00 | 55.878453 | 37.460028 | 4.3 | нет данных | нет данных | NaN | NaN | 1 | NaN | парк левобережный | False |
| 58 | coffeekaldi's | кофейня | москва, угличская улица, 13, стр. 8 | Северо-Восточный административный округ | ежедневно, 09:00–22:00 | 55.900316 | 37.570558 | 4.1 | средние | Средний счёт:500–800 ₽ | 650.0 | NaN | 1 | NaN | угличская улица | False |
| 60 | чебуречная история | кофейня | москва, ландшафтный заказник лианозовский | Северо-Восточный административный округ | ежедневно, 10:00–22:00 | 55.899845 | 37.570488 | 4.9 | нет данных | нет данных | NaN | NaN | 1 | NaN | ландшафтный заказник лианозовский | False |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 8289 | мираж | ресторан | москва, улица шкулёва, 2а | Юго-Восточный административный округ | пн-пт 11:00–23:00; сб,вс 11:00–00:00 | 55.693340 | 37.746231 | 4.7 | нет данных | нет данных | NaN | NaN | 0 | 90.0 | улица шкулёва | False |
| 8294 | wtfcoffee | кофейня | москва, улица артюхиной, 14/8с1 | Юго-Восточный административный округ | ежедневно, 10:00–22:00 | 55.699044 | 37.737790 | 4.4 | средние | нет данных | NaN | NaN | 0 | NaN | улица артюхиной | False |
| 8317 | беседка | кафе | москва, кузьминская улица, 10 | Юго-Восточный административный округ | ежедневно, 11:00–23:00 | 55.690691 | 37.787735 | 4.1 | нет данных | нет данных | NaN | NaN | 1 | NaN | кузьминская улица | False |
| 8379 | лагман хаус | кафе | москва, новороссийская улица, 14, стр. 2 | Юго-Восточный административный округ | ежедневно, 10:00–00:00 | 55.678772 | 37.759422 | 4.3 | нет данных | нет данных | NaN | NaN | 1 | 40.0 | новороссийская улица | False |
| 8400 | практика кофе | кофейня | москва, чонгарский бульвар, 26а, корп. 1 | Юго-Западный административный округ | пн-пт 08:00–22:00; сб,вс 09:00–22:00 | 55.654289 | 37.600722 | 4.4 | нет данных | нет данных | NaN | NaN | 0 | 55.0 | чонгарский бульвар | False |
457 rows × 16 columns
Улиц на которых расположен только один объект достаточно много - 457. Посмотрим визуализацию на карте.
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10, tiles='Cartodb Positron')
only_one_place_street.apply(create_marker, axis=1)
m
Улицы с одним заведением расположены достаточно равномерно по всей Москве. Явных закономерностей в расположении не прослеживается.
distr_avg_bill = places.groupby(
'district', as_index=False
).agg({'middle_avg_bill': 'median'})
distr_avg_bill['middle_avg_bill'] = distr_avg_bill['middle_avg_bill'].round(2)
# создаём карту Москвы
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10, tiles='Cartodb Positron')
# создаём хороплет с помощью конструктора Choropleth и добавляем его на карту
Choropleth(
geo_data=state_geo,
data=distr_avg_bill,
columns=['district', 'middle_avg_bill'],
key_on='feature.name',
fill_opacity=0.8,
legend_name='Медиана среднего чека в заведениях по районам',
).add_to(m)
# выводим карту
m
Самые большие значения среднего чека в центре Москвы, а также в Западном административном округе.
Самые низкие значения среднего чека в Юго-Западном, Северо-Восточном и Юго-Восточном административных округах.
Проведен анализ данных. Установлено следующее:
Основателям фонда «Shut Up and Take My Money» не даёт покоя успех сериала «Друзья». Их мечта — открыть такую же крутую и доступную, как «Central Perk», кофейню в Москве. Будем считать, что заказчики не боятся конкуренции в этой сфере, ведь кофеен в больших городах уже достаточно. Попробуем определить, осуществима ли мечта клиентов. Ответим на следующие вопросы:
coffee_houses = places.query('category == "кофейня"')
coffee_houses
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | street | is_24_7 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3 | dormouse coffee shop | кофейня | москва, улица маршала федоренко, 12 | Северный административный округ | ежедневно, 09:00–22:00 | 55.881608 | 37.488860 | 5.0 | нет данных | Цена чашки капучино:155–185 ₽ | NaN | 170.0 | 0 | NaN | улица маршала федоренко | False |
| 25 | в парке вкуснее | кофейня | москва, парк левобережный | Северный административный округ | ежедневно, 10:00–21:00 | 55.878453 | 37.460028 | 4.3 | нет данных | нет данных | NaN | NaN | 1 | NaN | парк левобережный | False |
| 45 | 9 bar coffee | кофейня | москва, коровинское шоссе, 41, стр. 1 | Северный административный округ | пн-пт 08:00–18:00 | 55.885837 | 37.513422 | 4.0 | нет данных | нет данных | NaN | NaN | 1 | 46.0 | коровинское шоссе | False |
| 46 | cofefest | кофейня | москва, улица маршала федоренко, 6с1 | Северный административный округ | пн-пт 09:00–19:00 | 55.879934 | 37.492522 | 3.6 | нет данных | нет данных | NaN | NaN | 1 | NaN | улица маршала федоренко | False |
| 52 | cofix | кофейня | москва, улица дыбенко, 7/1 | Северный административный округ | ежедневно, 08:00–22:00 | 55.878531 | 37.479395 | 3.8 | нет данных | нет данных | NaN | NaN | 1 | NaN | улица дыбенко | False |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 8356 | назис пури | кофейня | москва, люблинская улица, 61 | Юго-Восточный административный округ | ежедневно, 09:00–22:00 | 55.684103 | 37.738588 | 4.5 | нет данных | нет данных | NaN | NaN | 0 | NaN | люблинская улица | False |
| 8365 | квадрат кофе | кофейня | москва, волгоградский проспект, 73, стр. 1 | Юго-Восточный административный округ | пн-пт 08:30–21:30; сб,вс 09:00–21:30 | 55.709710 | 37.744450 | 4.2 | нет данных | Цена чашки капучино:100–220 ₽ | NaN | 160.0 | 0 | 206.0 | волгоградский проспект | False |
| 8376 | шоколад имбирь корица | кофейня | москва, грайвороновская улица, 23 | Юго-Восточный административный округ | пн-пт 09:30–19:30 | 55.721213 | 37.740755 | 4.1 | нет данных | нет данных | NaN | NaN | 0 | NaN | грайвороновская улица | False |
| 8385 | cafio | кофейня | москва, новохохловская улица, 49 | Юго-Восточный административный округ | пн-пт 07:00–22:00; сб,вс 07:00–21:00 | 55.724357 | 37.716415 | 4.7 | нет данных | Цена чашки капучино:80–120 ₽ | NaN | 100.0 | 0 | NaN | новохохловская улица | False |
| 8400 | практика кофе | кофейня | москва, чонгарский бульвар, 26а, корп. 1 | Юго-Западный административный округ | пн-пт 08:00–22:00; сб,вс 09:00–22:00 | 55.654289 | 37.600722 | 4.4 | нет данных | нет данных | NaN | NaN | 0 | 55.0 | чонгарский бульвар | False |
1413 rows × 16 columns
print(f'Всего в Москве {len(coffee_houses)} кофеен')
Всего в Москве 1413 кофеен
Посмотрим где они располагаются.
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10, tiles="Cartodb Positron")
marker_cluster = MarkerCluster().add_to(m)
coffee_houses.apply(create_clusters, axis=1)
m
Отметим на карте Москвы распределение количества кофеен в каждом районе.
distr_coffee_houses = coffee_houses.groupby(
'district', as_index=False
).agg({'name': 'count'})
# создаём карту Москвы
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10, tiles='Cartodb Positron')
# создаём хороплет с помощью конструктора Choropleth и добавляем его на карту
Choropleth(
geo_data=state_geo,
data=distr_coffee_houses,
columns=['district', 'name'],
key_on='feature.name',
fill_opacity=0.8,
legend_name='Количество кофеен по районам Москвы',
).add_to(m)
# выводим карту
m
distr_coffee_houses.sort_values(by='name', ascending=False)
| district | name | |
|---|---|---|
| 5 | Центральный административный округ | 428 |
| 2 | Северный административный округ | 193 |
| 3 | Северо-Восточный административный округ | 159 |
| 1 | Западный административный округ | 150 |
| 8 | Южный административный округ | 131 |
| 0 | Восточный административный округ | 105 |
| 7 | Юго-Западный административный округ | 96 |
| 6 | Юго-Восточный административный округ | 89 |
| 4 | Северо-Западный административный округ | 62 |
Больше всего кофеен в Центральном административном округе. 30% от общего количества кофеен в Москве. Меньше всего в Северо-Западном административном округе.
coffee_houses.query('is_24_7 == True')
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | street | is_24_7 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 200 | wild bean | кофейня | москва, дмитровское шоссе, 107е | Северный административный округ | ежедневно, круглосуточно | 55.878477 | 37.543426 | 3.5 | нет данных | нет данных | NaN | NaN | 1 | 20.0 | дмитровское шоссе | True |
| 971 | wild bean cafe | кофейня | москва, ярославское шоссе, 116 | Северо-Восточный административный округ | ежедневно, круглосуточно | 55.867822 | 37.708853 | 4.0 | нет данных | нет данных | NaN | NaN | 1 | 25.0 | ярославское шоссе | True |
| 1047 | wild bean cafe | кофейня | москва, ярославское шоссе, вл3с3 | Северо-Восточный административный округ | ежедневно, круглосуточно | 55.851778 | 37.676423 | 4.5 | нет данных | Цена чашки капучино:140–200 ₽ | NaN | 170.0 | 1 | NaN | ярославское шоссе | True |
| 1214 | wild bean cafe | кофейня | москва, мкад, 65-й километр, 8 | Северо-Западный административный округ | ежедневно, круглосуточно | 55.813787 | 37.390701 | 4.3 | нет данных | нет данных | NaN | NaN | 1 | NaN | мкад | True |
| 1291 | шоколадница | кофейня | москва, улица народного ополчения, 49, корп. 1 | Северо-Западный административный округ | ежедневно, круглосуточно | 55.794815 | 37.494834 | 4.2 | средние | Средний счёт:650–850 ₽ | 750.0 | NaN | 1 | 200.0 | улица народного ополчения | True |
| 1468 | кофе хауз | кофейня | москва, ленинградский проспект, 74 | Северный административный округ | ежедневно, круглосуточно | 55.805239 | 37.516246 | 4.0 | нет данных | Цена чашки капучино:235–335 ₽ | NaN | 285.0 | 1 | NaN | ленинградский проспект | True |
| 1790 | кофемания | кофейня | москва, ленинградский проспект, 37а, корп. 14,... | Северный административный округ | ежедневно, круглосуточно | 55.790899 | 37.542776 | 4.7 | нет данных | нет данных | NaN | NaN | 1 | 15.0 | ленинградский проспект | True |
| 1825 | you&coffee | кофейня | москва, улица золоторожский вал, 11, стр. 21 | Северный административный округ | ежедневно, круглосуточно | 55.803924 | 37.582251 | 4.2 | нет данных | нет данных | NaN | NaN | 1 | NaN | улица золоторожский вал | True |
| 1883 | кофемания | кофейня | москва, лесная улица, 5 | Центральный административный округ | ежедневно, круглосуточно | 55.777804 | 37.586346 | 4.4 | высокие | Средний счёт:2000 ₽ | 2000.0 | NaN | 1 | 140.0 | лесная улица | True |
| 2030 | cinnabon | кофейня | москва, долгоруковская улица, 40 | Центральный административный округ | ежедневно, круглосуточно | 55.778271 | 37.601991 | 4.2 | нет данных | нет данных | NaN | NaN | 1 | 230.0 | долгоруковская улица | True |
| 2073 | wild bean cafe | кофейня | москва, бутырская улица, 8а | Северо-Восточный административный округ | ежедневно, круглосуточно | 55.797124 | 37.584781 | 3.1 | нет данных | нет данных | NaN | NaN | 1 | 0.0 | бутырская улица | True |
| 2245 | шоколадница | кофейня | москва, краснопрудная улица, 3-5с1 | Центральный административный округ | ежедневно, круглосуточно | 55.777882 | 37.661270 | 4.2 | нет данных | нет данных | NaN | NaN | 1 | NaN | краснопрудная улица | True |
| 2334 | one price coffee | кофейня | москва, комсомольская площадь, 3 | Центральный административный округ | ежедневно, круглосуточно | 55.776860 | 37.654701 | 4.1 | нет данных | нет данных | NaN | NaN | 1 | 200.0 | комсомольская площадь | True |
| 2353 | кофейня one&double | кофейня | москва, комсомольская площадь, 5/43 | Центральный административный округ | ежедневно, круглосуточно | 55.780087 | 37.654421 | 4.3 | нет данных | нет данных | NaN | NaN | 0 | NaN | комсомольская площадь | True |
| 2516 | cofix | кофейня | москва, комсомольская площадь, 3 | Центральный административный округ | ежедневно, круглосуточно | 55.776955 | 37.655391 | 3.8 | нет данных | нет данных | NaN | NaN | 1 | 200.0 | комсомольская площадь | True |
| 2636 | кофе с собой | кофейня | москва, 5-я парковая улица, 42 | Восточный административный округ | ежедневно, круглосуточно | 55.798686 | 37.788311 | 4.0 | нет данных | Цена чашки капучино:100–120 ₽ | NaN | 110.0 | 1 | NaN | 5-я парковая улица | True |
| 3070 | wild bean | кофейня | москва, мкад, 60-й километр, 4бс1 | Западный административный округ | ежедневно, круглосуточно | 55.767519 | 37.371261 | 4.3 | нет данных | нет данных | NaN | NaN | 1 | NaN | мкад | True |
| 3081 | wild bean | кофейня | москва, рублёвское шоссе, 91а | Западный административный округ | ежедневно, круглосуточно | 55.741356 | 37.428633 | 4.2 | нет данных | Цена чашки капучино:140–200 ₽ | NaN | 170.0 | 1 | NaN | рублёвское шоссе | True |
| 3197 | шоколадница | кофейня | москва, площадь победы, 1, корп. б | Западный административный округ | ежедневно, круглосуточно | 55.735162 | 37.517861 | 4.3 | средние | Цена чашки капучино:284–299 ₽ | NaN | 291.0 | 1 | 48.0 | площадь победы | True |
| 3218 | шоколадница | кофейня | москва, кутузовский проспект, 45 | Западный административный округ | ежедневно, круглосуточно | 55.737240 | 37.524707 | 4.3 | средние | Средний счёт:700–1500 ₽ | 1100.0 | NaN | 1 | 50.0 | кутузовский проспект | True |
| 3358 | пирог хауз | кофейня | москва, славянский бульвар, 5, корп. 1, стр. 3 | Западный административный округ | ежедневно, круглосуточно | 55.727345 | 37.472614 | 3.8 | средние | нет данных | NaN | NaN | 1 | 12.0 | славянский бульвар | True |
| 3366 | you&coffee | кофейня | москва, 4-я магистральная улица, 5, стр. 1 | Северный административный округ | ежедневно, круглосуточно | 55.774512 | 37.520563 | 4.7 | нет данных | нет данных | NaN | NaN | 1 | 20.0 | 4-я магистральная улица | True |
| 3509 | кофемания | кофейня | москва, кудринская площадь, 46/54с1 | Центральный административный округ | ежедневно, круглосуточно | 55.758268 | 37.585356 | 4.4 | высокие | Средний счёт:1500–2500 ₽ | 2000.0 | NaN | 1 | NaN | кудринская площадь | True |
| 3511 | молоко | кофейня | москва, улица большая дмитровка, 7/5с6 | Центральный административный округ | ежедневно, круглосуточно | 55.761113 | 37.614631 | 4.8 | высокие | Средний счёт:1500–2000 ₽ | 1750.0 | NaN | 0 | NaN | улица большая дмитровка | True |
| 3685 | кофемания | кофейня | москва, большая никитская улица, 13 | Центральный административный округ | ежедневно, круглосуточно | 55.756507 | 37.604838 | 4.5 | высокие | Средний счёт:2500 ₽ | 2500.0 | NaN | 1 | 148.0 | большая никитская улица | True |
| 3688 | кофемания | кофейня | москва, улица новый арбат, 19 | Центральный административный округ | ежедневно, круглосуточно | 55.752136 | 37.587784 | 4.5 | высокие | Средний счёт:от 0 ₽ | 0.0 | NaN | 1 | 200.0 | улица новый арбат | True |
| 3831 | кофе хауз | кофейня | москва, кудринская площадь, 1 | Центральный административный округ | ежедневно, круглосуточно | 55.759719 | 37.580651 | 4.0 | средние | нет данных | NaN | NaN | 1 | 150.0 | кудринская площадь | True |
| 3987 | гоголь-моголь | кофейня | москва, гоголевский бульвар, 19 | Центральный административный округ | ежедневно, круглосуточно | 55.747215 | 37.599005 | 4.5 | средние | Средний счёт:300–700 ₽ | 500.0 | NaN | 0 | NaN | гоголевский бульвар | True |
| 4008 | кофемания | кофейня | москва, кутузовский проспект, 17 | Западный административный округ | ежедневно, круглосуточно | 55.746580 | 37.556662 | 4.4 | высокие | Средний счёт:2000–2500 ₽ | 2250.0 | NaN | 1 | 78.0 | кутузовский проспект | True |
| 4038 | кофемания | кофейня | москва, комсомольский проспект, 21, стр. 2 | Центральный административный округ | ежедневно, круглосуточно | 55.727810 | 37.583919 | 4.4 | высокие | Средний счёт:2000 ₽ | 2000.0 | NaN | 1 | 80.0 | комсомольский проспект | True |
| 4088 | шоколадница | кофейня | москва, зубовский бульвар, 17, стр. 1 | Центральный административный округ | ежедневно, круглосуточно | 55.736329 | 37.590706 | 4.2 | средние | Цена чашки капучино:239–274 ₽ | NaN | 256.0 | 1 | 320.0 | зубовский бульвар | True |
| 4112 | one and double | кофейня | москва, площадь киевского вокзала, 1 | Западный административный округ | ежедневно, круглосуточно | 55.743048 | 37.564394 | 4.1 | нет данных | нет данных | NaN | NaN | 0 | 10.0 | площадь киевского вокзала | True |
| 4263 | шоколадница | кофейня | москва, улица большая якиманка, 58/2 | Центральный административный округ | ежедневно, круглосуточно | 55.730621 | 37.611758 | 4.2 | нет данных | нет данных | NaN | NaN | 1 | 143.0 | улица большая якиманка | True |
| 4292 | кофе хауз | кофейня | москва, кутузовский проспект, 30 | Западный административный округ | ежедневно, круглосуточно | 55.740919 | 37.536004 | 4.2 | средние | Цена чашки капучино:270–280 ₽ | NaN | 275.0 | 1 | 50.0 | кутузовский проспект | True |
| 4307 | шоколадница | кофейня | москва, улица воздвиженка, 9, стр. 2 | Центральный административный округ | ежедневно, круглосуточно | 55.752559 | 37.603504 | 4.1 | средние | Цена чашки капучино:239–274 ₽ | NaN | 256.0 | 1 | 80.0 | улица воздвиженка | True |
| 4320 | шоколадница | кофейня | москва, ленинский проспект, 2 | Центральный административный округ | ежедневно, круглосуточно | 55.729082 | 37.611497 | 4.0 | нет данных | нет данных | NaN | NaN | 1 | 144.0 | ленинский проспект | True |
| 4419 | столица | кофейня | москва, улица земляной вал, 2 | Центральный административный округ | ежедневно, круглосуточно | 55.763066 | 37.656373 | 4.9 | нет данных | нет данных | NaN | NaN | 0 | 85.0 | улица земляной вал | True |
| 4502 | кофемания | кофейня | москва, улица покровка, 18/18с3 | Центральный административный округ | ежедневно, круглосуточно | 55.759220 | 37.646029 | 4.4 | высокие | Средний счёт:1500–2500 ₽ | 2000.0 | NaN | 1 | NaN | улица покровка | True |
| 4653 | cofix | кофейня | москва, центральный административный округ, кр... | Центральный административный округ | ежедневно, круглосуточно | 55.770414 | 37.651068 | 4.3 | нет данных | нет данных | NaN | NaN | 1 | NaN | центральный административный округ | True |
| 4734 | лаванда кофе | кофейня | москва, нижняя красносельская улица, 35с48 | Центральный административный округ | ежедневно, круглосуточно | 55.775128 | 37.672562 | 4.3 | средние | Цена чашки капучино:189–269 ₽ | NaN | 229.0 | 0 | NaN | нижняя красносельская улица | True |
| 4791 | шоколадница | кофейня | москва, улица маросейка, 3/13с1 | Центральный административный округ | ежедневно, круглосуточно | 55.757337 | 37.631427 | 4.2 | средние | Цена чашки капучино:239–274 ₽ | NaN | 256.0 | 1 | NaN | улица маросейка | True |
| 4916 | шоколадница | кофейня | москва, нижняя радищевская улица, 5, стр. 2 | Центральный административный округ | ежедневно, круглосуточно | 55.741845 | 37.653285 | 4.2 | нет данных | нет данных | NaN | NaN | 1 | 100.0 | нижняя радищевская улица | True |
| 5056 | кофе on | кофейня | москва, 3-й кадашёвский переулок, 2 | Центральный административный округ | ежедневно, круглосуточно | 55.742491 | 37.624693 | 4.3 | выше среднего | Средний счёт:1000–1500 ₽ | 1250.0 | NaN | 0 | 72.0 | 3-й кадашёвский переулок | True |
| 5131 | шоколадница | кофейня | москва, павелецкая площадь, 2с1 | Центральный административный округ | ежедневно, круглосуточно | 55.730602 | 37.635300 | 4.2 | нет данных | нет данных | NaN | NaN | 1 | NaN | павелецкая площадь | True |
| 5256 | one&double | кофейня | москва, павелецкая площадь, 1а, стр. 1 | Центральный административный округ | ежедневно, круглосуточно | 55.729675 | 37.639367 | 4.1 | низкие | Цена чашки капучино:60–120 ₽ | NaN | 90.0 | 1 | 150.0 | павелецкая площадь | True |
| 5304 | шоколадница | кофейня | москва, зелёный проспект, 22 | Восточный административный округ | ежедневно, круглосуточно | 55.750752 | 37.788529 | 4.2 | средние | Средний счёт:300–500 ₽ | 400.0 | NaN | 1 | 49.0 | зелёный проспект | True |
| 5339 | шоколадница | кофейня | москва, свободный проспект, 33 | Восточный административный округ | ежедневно, круглосуточно | 55.752784 | 37.819307 | 4.2 | нет данных | нет данных | NaN | NaN | 1 | 96.0 | свободный проспект | True |
| 5383 | кофе с собой | кофейня | москва, улица старый гай, 8а | Восточный административный округ | ежедневно, круглосуточно | 55.740397 | 37.827414 | 5.0 | нет данных | нет данных | NaN | NaN | 1 | 24.0 | улица старый гай | True |
| 5443 | шоколадница | кофейня | москва, зелёный проспект, 5/12с2 | Восточный административный округ | ежедневно, круглосуточно | 55.749856 | 37.774652 | 4.1 | нет данных | нет данных | NaN | NaN | 1 | NaN | зелёный проспект | True |
| 5891 | foodmoscowcoffee | кофейня | москва, ленинский проспект (дублёр) | Юго-Западный административный округ | ежедневно, круглосуточно | 55.703333 | 37.573414 | 4.1 | нет данных | нет данных | NaN | NaN | 0 | NaN | ленинский проспект (дублёр) | True |
| 6032 | шоколадница | кофейня | москва, улица дмитрия ульянова, 24 | Юго-Западный административный округ | ежедневно, круглосуточно | 55.687178 | 37.573645 | 4.2 | средние | Цена чашки капучино:239–274 ₽ | NaN | 256.0 | 1 | 48.0 | улица дмитрия ульянова | True |
| 6045 | шоколадница | кофейня | москва, профсоюзная улица, 19 | Юго-Западный административный округ | ежедневно, круглосуточно | 55.678665 | 37.564330 | 4.3 | средние | Цена чашки капучино:239–274 ₽ | NaN | 256.0 | 1 | 48.0 | профсоюзная улица | True |
| 6125 | шоколадница | кофейня | москва, ленинский проспект, 68/10 | Юго-Западный административный округ | ежедневно, круглосуточно | 55.689117 | 37.545799 | 4.2 | нет данных | Цена чашки капучино:239–274 ₽ | NaN | 256.0 | 1 | 96.0 | ленинский проспект | True |
| 6558 | wild bean cafe | кофейня | москва, ленинский проспект, 137ас1 | Юго-Западный административный округ | ежедневно, круглосуточно | 55.643246 | 37.471251 | 4.5 | нет данных | нет данных | NaN | NaN | 1 | NaN | ленинский проспект | True |
| 6592 | the wild bean cafe | кофейня | москва, проспект вернадского, 86д | Западный административный округ | ежедневно, круглосуточно | 55.660802 | 37.480297 | 4.2 | нет данных | нет данных | NaN | NaN | 1 | 40.0 | проспект вернадского | True |
| 6890 | one more, please | кофейня | москва, новочерёмушкинская улица, 58 | Юго-Западный административный округ | ежедневно, круглосуточно | 55.667990 | 37.563342 | 4.3 | средние | Цена чашки капучино:200–260 ₽ | NaN | 230.0 | 0 | 20.0 | новочерёмушкинская улица | True |
| 7528 | wild bean cafe | кофейня | москва, люблинская улица, 135/1с1 | Юго-Восточный административный округ | ежедневно, круглосуточно | 55.668973 | 37.741351 | 2.3 | нет данных | нет данных | NaN | NaN | 1 | NaN | люблинская улица | True |
| 7668 | wild bean | кофейня | москва, мкад, 41-й километр, 18, стр. 1 | Юго-Западный административный округ | ежедневно, круглосуточно | 55.618872 | 37.484253 | 4.3 | нет данных | нет данных | NaN | NaN | 1 | NaN | мкад | True |
| 7923 | wild bean | кофейня | москва, ясеневая улица, 13 | Южный административный округ | ежедневно, круглосуточно | 55.602350 | 37.723018 | 4.0 | нет данных | нет данных | NaN | NaN | 1 | 0.0 | ясеневая улица | True |
df = coffee_houses.groupby('is_24_7', as_index=False).agg({'name': 'count'})
is_24_7_dict = {
True : 'круглосуточные',
False : 'некруглосуточные'
}
df['is_24_7'] = df['is_24_7'].map(is_24_7_dict)
fig = px.pie(
df,
names='is_24_7',
values='name',
hole = 0.4,
color = 'is_24_7',
color_discrete_map = {
'круглосуточные': '#8690FF',
'некруглосуточные': '#ACD0F4',
}
)
fig.update_layout(
title='Cоотношение круглосуточных и некруглосуточных кофеен',
title_x = 0.5,
showlegend=False,
margin=dict(l=0, r=0, t=100, b=0),
)
fig.update_traces(
textposition='outside',
textinfo='percent+label',
marker=dict(line=dict(color='#000000',width=2)),
)
fig.show()
Круглосуточные кофейни существуют. Таких кофеен всего 4.18% от общего количества.
Посмотрим на карте, где расположены круглосуточные кофейни.
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10, tiles='Cartodb Positron')
coffee_houses.query('is_24_7 == True').apply(create_marker, axis=1)
m
Самое большое количество круглосуточных кофеен находится в центре Москвы. Но есть и в отдалении от центра, преимущественно на крупных улицах.
coffee_houses.query('is_24_7 == True')[['name', 'address', 'district', 'chain']].sort_values(by=['chain', 'name'])
| name | address | district | chain | |
|---|---|---|---|---|
| 5891 | foodmoscowcoffee | москва, ленинский проспект (дублёр) | Юго-Западный административный округ | 0 |
| 4112 | one and double | москва, площадь киевского вокзала, 1 | Западный административный округ | 0 |
| 6890 | one more, please | москва, новочерёмушкинская улица, 58 | Юго-Западный административный округ | 0 |
| 3987 | гоголь-моголь | москва, гоголевский бульвар, 19 | Центральный административный округ | 0 |
| 5056 | кофе on | москва, 3-й кадашёвский переулок, 2 | Центральный административный округ | 0 |
| 2353 | кофейня one&double | москва, комсомольская площадь, 5/43 | Центральный административный округ | 0 |
| 4734 | лаванда кофе | москва, нижняя красносельская улица, 35с48 | Центральный административный округ | 0 |
| 3511 | молоко | москва, улица большая дмитровка, 7/5с6 | Центральный административный округ | 0 |
| 4419 | столица | москва, улица земляной вал, 2 | Центральный административный округ | 0 |
| 2030 | cinnabon | москва, долгоруковская улица, 40 | Центральный административный округ | 1 |
| 2516 | cofix | москва, комсомольская площадь, 3 | Центральный административный округ | 1 |
| 4653 | cofix | москва, центральный административный округ, кр... | Центральный административный округ | 1 |
| 2334 | one price coffee | москва, комсомольская площадь, 3 | Центральный административный округ | 1 |
| 5256 | one&double | москва, павелецкая площадь, 1а, стр. 1 | Центральный административный округ | 1 |
| 6592 | the wild bean cafe | москва, проспект вернадского, 86д | Западный административный округ | 1 |
| 200 | wild bean | москва, дмитровское шоссе, 107е | Северный административный округ | 1 |
| 3070 | wild bean | москва, мкад, 60-й километр, 4бс1 | Западный административный округ | 1 |
| 3081 | wild bean | москва, рублёвское шоссе, 91а | Западный административный округ | 1 |
| 7668 | wild bean | москва, мкад, 41-й километр, 18, стр. 1 | Юго-Западный административный округ | 1 |
| 7923 | wild bean | москва, ясеневая улица, 13 | Южный административный округ | 1 |
| 971 | wild bean cafe | москва, ярославское шоссе, 116 | Северо-Восточный административный округ | 1 |
| 1047 | wild bean cafe | москва, ярославское шоссе, вл3с3 | Северо-Восточный административный округ | 1 |
| 1214 | wild bean cafe | москва, мкад, 65-й километр, 8 | Северо-Западный административный округ | 1 |
| 2073 | wild bean cafe | москва, бутырская улица, 8а | Северо-Восточный административный округ | 1 |
| 6558 | wild bean cafe | москва, ленинский проспект, 137ас1 | Юго-Западный административный округ | 1 |
| 7528 | wild bean cafe | москва, люблинская улица, 135/1с1 | Юго-Восточный административный округ | 1 |
| 1825 | you&coffee | москва, улица золоторожский вал, 11, стр. 21 | Северный административный округ | 1 |
| 3366 | you&coffee | москва, 4-я магистральная улица, 5, стр. 1 | Северный административный округ | 1 |
| 2636 | кофе с собой | москва, 5-я парковая улица, 42 | Восточный административный округ | 1 |
| 5383 | кофе с собой | москва, улица старый гай, 8а | Восточный административный округ | 1 |
| 1468 | кофе хауз | москва, ленинградский проспект, 74 | Северный административный округ | 1 |
| 3831 | кофе хауз | москва, кудринская площадь, 1 | Центральный административный округ | 1 |
| 4292 | кофе хауз | москва, кутузовский проспект, 30 | Западный административный округ | 1 |
| 1790 | кофемания | москва, ленинградский проспект, 37а, корп. 14,... | Северный административный округ | 1 |
| 1883 | кофемания | москва, лесная улица, 5 | Центральный административный округ | 1 |
| 3509 | кофемания | москва, кудринская площадь, 46/54с1 | Центральный административный округ | 1 |
| 3685 | кофемания | москва, большая никитская улица, 13 | Центральный административный округ | 1 |
| 3688 | кофемания | москва, улица новый арбат, 19 | Центральный административный округ | 1 |
| 4008 | кофемания | москва, кутузовский проспект, 17 | Западный административный округ | 1 |
| 4038 | кофемания | москва, комсомольский проспект, 21, стр. 2 | Центральный административный округ | 1 |
| 4502 | кофемания | москва, улица покровка, 18/18с3 | Центральный административный округ | 1 |
| 3358 | пирог хауз | москва, славянский бульвар, 5, корп. 1, стр. 3 | Западный административный округ | 1 |
| 1291 | шоколадница | москва, улица народного ополчения, 49, корп. 1 | Северо-Западный административный округ | 1 |
| 2245 | шоколадница | москва, краснопрудная улица, 3-5с1 | Центральный административный округ | 1 |
| 3197 | шоколадница | москва, площадь победы, 1, корп. б | Западный административный округ | 1 |
| 3218 | шоколадница | москва, кутузовский проспект, 45 | Западный административный округ | 1 |
| 4088 | шоколадница | москва, зубовский бульвар, 17, стр. 1 | Центральный административный округ | 1 |
| 4263 | шоколадница | москва, улица большая якиманка, 58/2 | Центральный административный округ | 1 |
| 4307 | шоколадница | москва, улица воздвиженка, 9, стр. 2 | Центральный административный округ | 1 |
| 4320 | шоколадница | москва, ленинский проспект, 2 | Центральный административный округ | 1 |
| 4791 | шоколадница | москва, улица маросейка, 3/13с1 | Центральный административный округ | 1 |
| 4916 | шоколадница | москва, нижняя радищевская улица, 5, стр. 2 | Центральный административный округ | 1 |
| 5131 | шоколадница | москва, павелецкая площадь, 2с1 | Центральный административный округ | 1 |
| 5304 | шоколадница | москва, зелёный проспект, 22 | Восточный административный округ | 1 |
| 5339 | шоколадница | москва, свободный проспект, 33 | Восточный административный округ | 1 |
| 5443 | шоколадница | москва, зелёный проспект, 5/12с2 | Восточный административный округ | 1 |
| 6032 | шоколадница | москва, улица дмитрия ульянова, 24 | Юго-Западный административный округ | 1 |
| 6045 | шоколадница | москва, профсоюзная улица, 19 | Юго-Западный административный округ | 1 |
| 6125 | шоколадница | москва, ленинский проспект, 68/10 | Юго-Западный административный округ | 1 |
Практически все круглосуточные кофейни - сетевые. Несетевых всего 9 из 59.
coffee_houses_rating = coffee_houses.groupby(
'district', as_index=False
).agg({'rating': 'mean'})
coffee_houses_rating['rating'] = coffee_houses_rating['rating'].round(2)
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10, tiles='Cartodb Positron')
Choropleth(
geo_data=state_geo,
data=coffee_houses_rating,
columns=['district', 'rating'],
key_on='feature.name',
fill_opacity=0.8,
legend_name='Средний рейтинг кофеен по районам',
).add_to(m)
m
Самые высокие рейтинги у кофеен, расположенных в Центральном и Северо-Западном административных округах.
Самые низкие рейтинги у кофеен, расположенных в Западном и Северо-Восточном административных округах.
coffee_houses_price = coffee_houses.groupby(
'district', as_index=False
).agg({'middle_coffee_cup': 'median'})
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10, tiles='Cartodb Positron')
Choropleth(
geo_data=state_geo,
data=coffee_houses_price,
columns=['district', 'middle_coffee_cup'],
key_on='feature.name',
fill_opacity=0.8,
legend_name='Средняя стоимость чашки капучино по районам',
).add_to(m)
m
Самые высокие медианные цены чашки каппучино в Западном, Центральном и Юго-Западном административных округах.
coffee_houses_price.sort_values(by='middle_coffee_cup')
| district | middle_coffee_cup | |
|---|---|---|
| 0 | Восточный административный округ | 135.0 |
| 6 | Юго-Восточный административный округ | 147.5 |
| 8 | Южный административный округ | 150.0 |
| 2 | Северный административный округ | 159.0 |
| 3 | Северо-Восточный административный округ | 162.5 |
| 4 | Северо-Западный административный округ | 165.0 |
| 1 | Западный административный округ | 189.0 |
| 5 | Центральный административный округ | 190.0 |
| 7 | Юго-Западный административный округ | 198.0 |
При выборе стоимости чашки капучино в новой кофейне, стоит ориентироваться на стоимость чашки в соседних заведениях. Если капучино будет стоить дороже, то высокая цена может отпугнуть посетителей.
1) Расположение – Центральный или Западный административный округ. В Центральном административном округе самая большая проходимость и самые высокие цены. В Западном административном округе также высокие цены, а рейтинги кофеен низкие. Таким образом, если открыть хорошую кофейню, то она может стать очень популярной на фоне остальных.
2) Режим работы – некруглосуточный. Круглосутчных кофеен очень мало, так как у посетителей, как правило, нет необходимости собираться с друзьями ночью. Или зайти ночью по пути на работу, с работы или в обеденный перерыв. Так что нужно придерживаться обычного дневного графика работы.
3) Стоимость чашки капучино при открытии не должна превышать 190 рублей для Центрального и Западного административных округов. Если капучино будет стоить дороже обычной (медианной) цены в районе, то высокая цена может отпугнуть посетителей на этапе начала работы.
4) Тип кофейни – несетевая. Кофеен в Москве очень много. Создание собственной, неповторимой кофейни может привлечь посетителей при большом количестве заведений такого же типа в округе.
5) Количество посадочных мест около 80 (допустимый диапазон 40 - 140 мест). Нужно руководствоваться типичными для кофеен значениями количества посадочных мест.
Проведен анализ кофеен в Москве. Установлено следующее:
Цель исследования - найти особенности рынка заведений общественного питания Москвы.
Результат исследования поможет в выборе подходящего места для открытия заведения общественного питания в Москве.
Исследование проводится на основе данных сервисов Яндекс Карты и Яндекс Бизнес на лето 2022 года.
Данные moscow_places.csv загружены. Установлено, что:
Проведена предобработка данных:
Проведен анализ данных. Установлено следующее:
Проведен анализ кофеен в Москве. Установлено следующее:
Подготовлены рекомендации для открытия новой кофейни в Москве: